package user

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"regexp"
	"shop/constant"
	redis2 "shop/database/redis"
	"shop/formdata"
	"shop/internal/controller/base"
	"shop/internal/server"
	user2 "shop/internal/server/user"
	"shop/pkg"
	"strconv"
	"time"
)

// 发送验证码
func SendCode(c *gin.Context) {
	var sendcode formdata.SendCode
	if err := c.ShouldBindJSON(&sendcode); err != nil {
		base.RespData(c, nil, err)
		return
	}
	// 修正正则匹配逻辑
	matched, _ := regexp.MatchString(`^1[3-9]\d{9}$`, sendcode.Phone)
	if !matched {
		base.RespData(c, nil, fmt.Errorf("手机号格式错误"))
		return
	}
	sendCode, err := pkg.SendCode(sendcode.Phone)
	if err != nil {
		base.RespData(c, nil, fmt.Errorf("验证码发送失败: %v", err))
		return
	}
	base.RespData(c, sendCode, nil)
}

// 用户注册
func UserRegister(c *gin.Context) {
	var register formdata.Register
	if err := c.ShouldBindJSON(&register); err != nil {
		base.RespData(c, nil, err)
		return
	}
	if register.Password == "" {
		base.RespData(c, nil, fmt.Errorf("密码不能为空"))
		return
	}
	// 修正正则匹配逻辑
	matched, _ := regexp.MatchString(`^1[3-9]\d{9}$`, register.Phone)
	if !matched {
		base.RespData(c, nil, fmt.Errorf("手机号格式错误"))
		return
	}
	if register.Code == "" {
		base.RespData(c, nil, fmt.Errorf("验证码不能为空"))
		return
	}
	// 检查过期时间（秒）
	err := redis2.ExpirationData(register.Phone)
	if err != nil {
		base.RespData(c, nil, fmt.Errorf("验证码过期"))
		return
	}
	err = redis2.GetString(register.Phone, register.Code)
	if err != nil {
		base.RespData(c, nil, err)
		return
	}
	userRegister, err := user2.UserRegister(register.Phone, register.Password)
	if err != nil {
		base.RespData(c, nil, err)
		return
	}
	token := server.SetToken(int(userRegister.ID))
	base.RespData(c, map[string]interface{}{
		"token": token,
		"pass":  userRegister.Password,
	}, nil)
}

// 用户登录
func UserLogin(c *gin.Context) {
	var login formdata.Login
	if err := c.ShouldBindJSON(&login); err != nil {
		base.RespData(c, nil, err)
		return
	}
	if login.Type != constant.LoginTypeCode && login.Type != constant.LoginTypePwd {
		base.RespData(c, nil, fmt.Errorf("登录类型错误"))
		return
	}
	// 修正正则匹配逻辑
	matched, _ := regexp.MatchString(`^1[3-9]\d{9}$`, login.Phone)
	if !matched {
		base.RespData(c, nil, fmt.Errorf("手机号格式错误"))
		return
	}
	userLogin, _ := user2.SearchByPhone(login.Phone)
	//type=1 手机号验证码登录
	if login.Type == constant.LoginTypeCode {
		// 检查过期时间（秒）
		err := redis2.ExpirationData(login.Phone)
		if err != nil {
			base.RespData(c, nil, fmt.Errorf("验证码过期"))
			return
		}
		/*err = redis2.GetString(login.Phone, login.Keyword)
		if err != nil {
			base.RespData(c, nil, fmt.Errorf("验证码输入错误"))
			return
		}*/
		base.RespData(c, userLogin, nil)
		return
	}
	/*	if !pkg.CheckPasswordHash(userLogin.Password, login.Keyword) {
		base.RespData(c, nil, fmt.Errorf("密码输入错误"))
		return
	}*/

	token := server.SetToken(int(userLogin.ID))

	base.RespData(c, map[string]interface{}{
		"userID":   token,
		"userInfo": userLogin,
	}, nil)
}

// 修改密码
func UpdatePassword(c *gin.Context) {
	var passUpd formdata.Register
	if err := c.ShouldBindJSON(&passUpd); err != nil {
		base.RespData(c, nil, err)
		return
	}
	// 修正正则匹配逻辑
	matched, _ := regexp.MatchString(`^1[3-9]\d{9}$`, passUpd.Phone)
	if !matched {
		base.RespData(c, nil, fmt.Errorf("手机号格式错误"))
		return
	}
	if passUpd.Code == "" {
		base.RespData(c, nil, fmt.Errorf("验证码不能为空"))
		return
	}
	// 检查过期时间（秒）
	err := redis2.ExpirationData(passUpd.Phone)
	if err != nil {
		base.RespData(c, nil, fmt.Errorf("验证码过期"))
		return
	}
	err = redis2.GetString(passUpd.Phone, passUpd.Code)
	if err != nil {
		base.RespData(c, nil, fmt.Errorf("验证码输入错误"))
		return
	}
	passwordUpd, err := user2.UserPasswordUpd(passUpd.Phone, passUpd.Code)
	if err != nil {
		return
	}
	base.RespData(c, passwordUpd, nil)
}

// 换绑手机号码
func UpdatePhone(c *gin.Context) {
	var updatePhone formdata.UpdPhone
	if err := c.ShouldBindJSON(&updatePhone); err != nil {
		base.RespData(c, nil, err)
		return
	}
	// 修正正则匹配逻辑
	phone, _ := regexp.MatchString(`^1[3-9]\d{9}$`, updatePhone.Phone)
	newPhone, _ := regexp.MatchString(`^1[3-9]\d{9}$`, updatePhone.NewPhone)
	if !newPhone || !phone {
		base.RespData(c, nil, fmt.Errorf("新手机号格式错误"))
		return
	}
	if updatePhone.Code == "" || updatePhone.NewCode == "" {
		base.RespData(c, nil, fmt.Errorf("验证码不能为空"))
		return
	}
	// 检查过期时间（秒）1
	err := redis2.ExpirationData(updatePhone.Phone)
	if err != nil {
		base.RespData(c, nil, err)
		return
	}
	err = redis2.GetString(updatePhone.Phone, updatePhone.Code)
	if err != nil {
		base.RespData(c, nil, fmt.Errorf("验证码输入错误"))
		return
	}
	phoneUpd, _ := user2.UserPhoneUpd(updatePhone.Phone, updatePhone.NewPhone)

	// 检查过期时间（秒）2
	err = redis2.ExpirationData(updatePhone.NewPhone)
	if err != nil {
		base.RespData(c, nil, err)
		return
	}
	err = redis2.GetString(updatePhone.NewPhone, updatePhone.NewCode)
	if err != nil {
		base.RespData(c, nil, fmt.Errorf("新绑定手机号验证码过期"))
		return
	}

	base.RespData(c, phoneUpd.Phone, nil)
}

// 用户详情
func UserInfo(c *gin.Context) {
	var userToken formdata.SearchByToken
	if err := c.ShouldBindJSON(&userToken); err != nil {
		base.RespData(c, nil, err)
		return
	}
	if userToken.Token == "" {
		base.RespData(c, nil, fmt.Errorf("token不能为空"))
		return
	}

	token, err := server.GetToken(userToken.Token)
	if err != nil {
		return
	}

	uID, err := strconv.Atoi(token)
	if err != nil {
		return
	}
	user, err := user2.UserSearchBYUserId(uID)
	if err != nil {
		return
	}

	base.RespData(c, user, nil)
}

// 用户信息修改
func UserMessageUpd(c *gin.Context) {
	var message formdata.UserMessage
	if err := c.ShouldBindJSON(&message); err != nil {
		base.RespData(c, nil, err)
		return
	}
	if message.Token == "" {
		base.RespData(c, nil, fmt.Errorf("token不能为空"))
		return
	}
	udp, err := user2.UserMessageUdp(message)
	if err != nil {
		return
	}
	base.RespData(c, udp, nil)
}

// 退出登录 修改用户状态
func UserLoginOut(c *gin.Context) {
	var loginout *formdata.SearchByToken
	if err := c.ShouldBindJSON(&loginout); err != nil {
		base.RespData(c, nil, err)
		return
	}
	if loginout.Token == "" {
		base.RespData(c, nil, fmt.Errorf("token不能为空"))
		return
	}
	token, err := server.GetToken(loginout.Token)
	if err != nil {
		return
	}
	atoi, err := strconv.Atoi(token)
	if err != nil {
		return
	}
	statusUpd, err := user2.UserStatusUpd(atoi)
	if err != nil {
		return
	}
	base.RespData(c, statusUpd, nil)
}

func UploadOss(c *gin.Context) {
	file, _ := c.FormFile("filename")

	if file.Size > 1024*1024*10 {
		base.RespData(c, nil, fmt.Errorf("图片过大"))
		return
	}
	format := time.Now().Format("2006-01-02")
	filename := format + file.Filename

	image := pkg.OssImage(file, filename)
	base.RespData(c, map[string]interface{}{
		"image": image,
	}, nil)
}
